{
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "# 7.信号分解\n",
    "## 7.1.主成分分析法\n",
    "<P>主成分分析法的目的是降低数据集的维度,以最小的信息损失降低数据集的维度.在sklearn中,实现主成分分析的类为sklearn.decomposition.PCA</P>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['sepal length (cm)' 'sepal width (cm)' 'petal length (cm)'\n",
      " 'petal width (cm)' 'target']\n",
      "方差的解释情况:\n",
      "[0.72962445 0.22850762]\n",
      "方差解释比率\n",
      "方差解释比率:95.81320720000164%\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn import datasets\n",
    "\n",
    "iris = datasets.load_iris()\n",
    "iris_X = iris.data\n",
    "iris_y = iris.target\n",
    "feature_names = iris.feature_names\n",
    "iris_names = np.append(feature_names,'target')\n",
    "print(iris_names)\n",
    "\n",
    "# 特征变量的量级对PCA有很大影响,所以首先需要标准化\n",
    "# 这里使用StandScaler()标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "# 对数据集中的特征变量做标准化(均值为0，方差为1)\n",
    "X = StandardScaler().fit_transform(iris_X)\n",
    "from sklearn.decomposition import PCA\n",
    "# 选择两个主成分\n",
    "pca = PCA(n_components=2)\n",
    "principleComponents = pca.fit_transform(X)\n",
    "print(\"方差的解释情况:\")\n",
    "print(pca.explained_variance_ratio_)\n",
    "varianceExplained = np.sum(pca.explained_variance_ratio_)\n",
    "print(f\"方差解释比率\")\n",
    "print(f'方差解释比率:{varianceExplained*100}%')"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-13T05:06:09.368878600Z",
     "start_time": "2023-09-13T05:06:06.086611900Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(150, 3)\n"
     ]
    }
   ],
   "source": [
    "# 一维数据变为二维数据,以便在维度上与X保持一致\n",
    "y = np.reshape(iris_y,(X.shape[0],1))\n",
    "# 构建新的数据集(包含了目标变量)\n",
    "iris_new = np.concatenate([principleComponents,y],axis=1)\n",
    "print(iris_new.shape)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-13T05:11:05.568250200Z",
     "start_time": "2023-09-13T05:11:05.351206800Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 432x432 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "# 支持中文\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号\n",
    "\n",
    "# 初始化画布\n",
    "fig = plt.figure(figsize=(6,6))\n",
    "# 可视化异常点,并把异常点使用红色显示\n",
    "plt.subplot(1,1,1)\n",
    "plt.title(\"PCA可视化\")\n",
    "### 获取类别为0，1，2.的样本索引\n",
    "index0 = (iris_new[:,2]==0)\n",
    "index1 = (iris_new[:,2]==1)\n",
    "index2 = (iris_new[:,2]==2)\n",
    "# 第一个类别(0)用红色圆点表示\n",
    "plt.scatter(iris_new[index0,0],iris_new[index0,1],c='r',s=50,label='类别0')\n",
    "# 第二个类别(1)用以绿色原点展示\n",
    "plt.scatter(iris_new[index1,0],iris_new[index1,1],c='g',s=50,label='类别1')\n",
    "# 第三个类别(2)用蓝色原点展示\n",
    "plt.scatter(iris_new[index2,0],iris_new[index2,1],c='b',s=50,label='类别2')\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-13T05:24:37.649704300Z",
     "start_time": "2023-09-13T05:24:37.384703500Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "targets = [0,1,2]\n",
    "colors = ['r','g','b']\n",
    "for target ,color in zip(targets,colors):\n",
    "    indicesToKeep = (iris_new[:,2]==target)\n",
    "    labelTxt = '类别'+str(target)\n",
    "    plt.scatter(iris_new[indicesToKeep,0],\n",
    "                iris_new[indicesToKeep,1],\n",
    "                c=color,s=50,label=labelTxt\n",
    "                )\n",
    "\n",
    "# 设置X，Y轴标签文字\n",
    "plt.xlabel('第一个主成分')\n",
    "plt.ylabel(\"第二个主成分\")\n",
    "\n",
    "# 设置图列文字\n",
    "plt.legend(loc='lower right')\n",
    "\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-13T05:31:02.868050900Z",
     "start_time": "2023-09-13T05:30:59.565133700Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 7.2.核主成分分析KPCA"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 1080x576 with 2 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "from scipy.linalg import eigh\n",
    "from scipy.spatial.distance import pdist,squareform\n",
    "from sklearn.datasets import make_moons\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "def stepwise_kpca(X,gamma,n_components):\n",
    "    \"\"\"\n",
    "    基于 rbf的核主成分分析kPCA\n",
    "    :param X: 一个numpy数组,表示输入(原始)数据集\n",
    "    :param gamma: RBF核函数的参数\n",
    "    :param n_components: 选择的主成分数量\n",
    "    :return:\n",
    "    前k个最大的特征值(lambdas)及其对应的特征向量(alphas)\n",
    "    \"\"\"\n",
    "    # 计算输入数据集中两两点的平方欧几里得距离\n",
    "    sq_dists = pdist(X,'sqeuclidean')\n",
    "    # 转换sq_dist为一个对称方阵\n",
    "    mat_sq_dists = squareform(sq_dists)\n",
    "    # 计算方阵的核居正\n",
    "    K = np.exp(-gamma*mat_sq_dists)\n",
    "    # 居中对称核矩阵\n",
    "    N = K.shape[0]\n",
    "    one_n = np.ones((N,N))/N\n",
    "    K_norm = K-one_n.dot(K)-K.dot(one_n)+one_n.dot(K).dot(one_n)\n",
    "    # 获取按特征值倒序排序及其对应的特征向量\n",
    "    eigvals,eigvecs = eigh(K_norm)\n",
    "    # 获取前n_components个特征值及其对应的特征向量\n",
    "    lambdas = [eigvals[-i] for i in range(1,n_components+1)]\n",
    "    alphas = np.column_stack(list((eigvecs[:,-i] for i in list(range(1,n_components+1)))))\n",
    "    return lambdas,alphas\n",
    "\n",
    "# 生成两个交错半圆的数据集(两个类别),用于投影到一个1维子空间中(使用EBF核函数)\n",
    "X,y = make_moons(n_samples=100,random_state=123)\n",
    "# 首先绘制生成的数据集：散点图\n",
    "# 设置绘图区域的尺寸,宽15,高8\n",
    "fig = plt.figure(figsize=(15,8))\n",
    "# 一行,两列共两个图形:一个原始数据,一个转换后的数据\n",
    "plt.subplot(1,2,1)\n",
    "plt.scatter(X[y==0],X[y==0],color='red',alpha=0.5)\n",
    "plt.scatter(X[y==1],X[y==1],color='blue',alpha=0.5)\n",
    "\n",
    "plt.title(\"非线性二维数据集\")\n",
    "plt.ylabel(\"y轴\")\n",
    "plt.xlabel(\"x轴\")\n",
    "\n",
    "def project_x(x_new,X,gamma,lambdas,alphas):\n",
    "    \"\"\"\n",
    "    单个映射点的计算\n",
    "    :param x_new:一个新的数据样本\n",
    "    :param X: 原始数据集\n",
    "    :param gamma: RBF核函数的参数\n",
    "    :param lambdas: 计算获取的特征值\n",
    "    :param alphas: 计算获取的特征向量\n",
    "    :return: 映射到子空间的新数据值\n",
    "    \"\"\"\n",
    "    pair_dist = np.array([np.sum((x_new-row)**2) for row in X])\n",
    "    k = np.exp(-gamma*pair_dist)\n",
    "    # 返回矩阵点积\n",
    "    return k.dot(alphas/lambdas)\n",
    "\n",
    "lambdas,alphas =stepwise_kpca(X,gamma=15,n_components=1)\n",
    "# 随机取一个点,验证方法的正确性\n",
    "# 假设X[25]为一个新数据点,把它映射到新的子空间中(1维)\n",
    "x_new = X[25]\n",
    "X_proj = alphas[25]\n",
    "# x_new的新映射\n",
    "x_reproj= project_x(x_new,X,gamma=15,lambdas=lambdas,alphas=alphas)\n",
    "# 绘制新子空间下的数据集图形：散点图\n",
    "plt.subplot(1,2,2)\n",
    "plt.scatter(X_proj,0,color='black',label='数据样本的原始投影',marker='^',s=100)\n",
    "plt.scatter(X_proj,0,color='green',label='X[25]的重新映射点',marker='x',s=200)\n",
    "\n",
    "plt.legend(scatterpoints=1)\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-13T07:11:32.605021900Z",
     "start_time": "2023-09-13T07:11:31.040405800Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 7.3.字典学习"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from sklearn.decomposition import SparseCoder\n",
    "from sklearn.utils.fixes import np_version,_parse_version\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "def ricker_function(resolution,center,width):\n",
    "    \"\"\"离散二次采样Ricker小波,也成为墨西哥帽小波,一种小波函数,常用于小波变换\"\"\"\n",
    "    x = np.linspace(0,resolution-1,resolution)\n",
    "    x = (\n",
    "        (2/(np.sqrt(3*width)*np.pi**0.25))\n",
    "        *(1-(x-center)**2/width**2)\n",
    "        *np.exp(-((x-center)**2)/(2*width**2))\n",
    "    )\n",
    "    return x"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-13T07:55:01.477443800Z",
     "start_time": "2023-09-13T07:55:01.458444100Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(178, 13)\n",
      "[[1.423e+01 1.710e+00 2.430e+00 1.560e+01 1.270e+02 2.800e+00 3.060e+00\n",
      "  2.800e-01 2.290e+00 5.640e+00 1.040e+00 3.920e+00 1.065e+03]\n",
      " [1.320e+01 1.780e+00 2.140e+00 1.120e+01 1.000e+02 2.650e+00 2.760e+00\n",
      "  2.600e-01 1.280e+00 4.380e+00 1.050e+00 3.400e+00 1.050e+03]\n",
      " [1.316e+01 2.360e+00 2.670e+00 1.860e+01 1.010e+02 2.800e+00 3.240e+00\n",
      "  3.000e-01 2.810e+00 5.680e+00 1.030e+00 3.170e+00 1.185e+03]\n",
      " [1.437e+01 1.950e+00 2.500e+00 1.680e+01 1.130e+02 3.850e+00 3.490e+00\n",
      "  2.400e-01 2.180e+00 7.800e+00 8.600e-01 3.450e+00 1.480e+03]\n",
      " [1.324e+01 2.590e+00 2.870e+00 2.100e+01 1.180e+02 2.800e+00 2.690e+00\n",
      "  3.900e-01 1.820e+00 4.320e+00 1.040e+00 2.930e+00 7.350e+02]]\n"
     ]
    }
   ],
   "source": [
    "# 使用PCA降维预测啤酒分类\n",
    "# 导入数据\n",
    "from sklearn.datasets import load_wine\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "wine = load_wine()\n",
    "X_train,X_test,y_train,y_test = train_test_split(wine.data,wine.target,random_state=0)\n",
    "print(wine.data.shape)\n",
    "print(wine.data[:5])\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-14T04:39:37.084274300Z",
     "start_time": "2023-09-14T04:39:36.259429700Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最好的参数组合 {'svc__C': 1, 'svc__gamma': 1}\n",
      "最好的交叉验证集精度 0.977\n",
      "测试集精度 1.0\n"
     ]
    }
   ],
   "source": [
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "param_scv ={\n",
    "    'svc__gamma':[0.001,0.01,0.1,1,10],\n",
    "    'svc__C':[0.001,0.01,0.1,1,10]\n",
    "}\n",
    "pipe_SVC = Pipeline([(\"scaler\",MinMaxScaler()),(\"svc\",SVC())])\n",
    "#pipe_SVC.set_params(param_scv)\n",
    "grid_svc = GridSearchCV(pipe_SVC,param_grid=param_scv)\n",
    "grid_svc.fit(X_train,y_train)\n",
    "print(\"最好的参数组合\",grid_svc.best_params_)\n",
    "print(\"最好的交叉验证集精度\",round(grid_svc.best_score_,3))\n",
    "print(\"测试集精度\",round(grid_svc.score(X_test,y_test),3))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-14T02:31:47.472773600Z",
     "start_time": "2023-09-14T02:31:47.024776500Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最佳参数 {'knn__n_neighbors': 3}\n",
      "最佳验证集精度 0.97\n",
      "测试集精度 1.0\n"
     ]
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.decomposition import PCA\n",
    "from sklearn.feature_selection import SelectKBest\n",
    "\n",
    "params_knn = {'knn__n_neighbors':[3,4,5,6,7,8]}\n",
    "pipe_knn = Pipeline([('scaler',MinMaxScaler()),(\"pca\",PCA(n_components=8)),('selectKBset',SelectKBest(k=4)),(\"knn\",KNeighborsClassifier())])\n",
    "grid_knn = GridSearchCV(pipe_knn,param_grid=params_knn,n_jobs=-1)\n",
    "grid_knn.fit(X_train,y_train)\n",
    "print(\"最佳参数\",grid_knn.best_params_)\n",
    "print(\"最佳验证集精度\",round(grid_knn.best_score_,3))\n",
    "print(\"测试集精度\",grid_knn.score(X_test,y_test))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-14T05:02:25.286175400Z",
     "start_time": "2023-09-14T05:02:02.385280900Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 7.4 因子分析\n",
    "<P>因子分析法的思想是:根据特征变量间相关性大小把变量分组,使得同组内变量之间相关性较高，但不同组之间的相关性较低,每组变量代表一个基本结构,即公共因子，也称为隐形变量。这样,任何一个原始特征变量都可以由这些公共因子的组合来表示</P>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      " 主成分分析PCA:\n",
      "[[ 0.52106591  0.37741762]\n",
      " [-0.26934744  0.92329566]\n",
      " [ 0.5804131   0.02449161]\n",
      " [ 0.56485654  0.06694199]]\n",
      "\n",
      "\n",
      " 无旋转因子分析FA:\n",
      "[[ 0.88096009 -0.4472869 ]\n",
      " [-0.41691605 -0.55390036]\n",
      " [ 0.99918858  0.01915283]\n",
      " [ 0.96228895  0.05840206]]\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 576x360 with 2 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.datasets import load_iris\n",
    "from sklearn.decomposition import PCA,FactorAnalysis\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 支持中文\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签\n",
    "plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号\n",
    "\n",
    "# 以鸢尾花数据集为列\n",
    "data = load_iris()\n",
    "X = StandardScaler().fit_transform(data[\"data\"])\n",
    "feature_names = data['feature_names']\n",
    "\n",
    "n_comps = 2 # 主成分分析PCA的主成分为2,因子分析的因子数量也为2\n",
    "methods = [\n",
    "    ('主成分分析PCA',PCA()),\n",
    "    (\"无旋转因子分析FA\",FactorAnalysis()),\n",
    "    #(\"Varimax旋转因子分析FA\",FactorAnalysis(rotation='varimax'))\n",
    "]\n",
    "fig,axes = plt.subplots(ncols=len(methods),figsize=(8,5))\n",
    "for ax,(method,fa) in zip(axes,methods):\n",
    "    fa.set_params(n_components=n_comps)\n",
    "    fa.fit(X)\n",
    "\n",
    "    components = fa.components_.T\n",
    "    print(\"\\n\\n %s:\"%method)\n",
    "    print(components)\n",
    "\n",
    "    # vmax = np.abs(components).max()\n",
    "    # ax.imshow(components,cmap='RdBu_r',vmax=vmax,vmin=vmax)\n",
    "    # ax.set_yticks(np.arange(len(feature_names)))\n",
    "    # if ax.get_subplotspec().is_first_col():\n",
    "    #     ax.set_yticklabels(feature_names)\n",
    "    # else:\n",
    "    #     ax.set_yticklabels([])\n",
    "    # ax.set_title(str(method))\n",
    "    # ax.set_xticks([0,1])\n",
    "    # if(method==methods[0][0]):\n",
    "    #     ax.set_xticklabels(['主成分1','主成分2'])\n",
    "    # else:\n",
    "    #     ax.set_xticklabels(['因子1','因子2'])\n",
    "    #\n",
    "    # # 显示\n",
    "    # fig.suptitle(\"主成分/因子\")\n",
    "    # plt.tight_layout()\n",
    "    # plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-14T05:36:30.091192300Z",
     "start_time": "2023-09-14T05:36:26.653490Z"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 7.5.非负矩阵分解"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "转换矩阵W:\n",
      "[[0.         0.46880684]\n",
      " [0.55699523 0.3894146 ]\n",
      " [1.00331638 0.41925352]\n",
      " [1.6733999  0.22926926]\n",
      " [2.34349311 0.03927954]\n",
      " [2.78981512 0.06911798]]\n",
      "-------------------------------------\n",
      "成分矩阵H\n",
      "[[2.09783018 0.30560234]\n",
      " [2.13443044 2.13171694]]\n",
      "\n",
      "=====================================\n",
      "转换矩阵W与成分矩阵H的乘积:\n",
      "[[1.00063558 0.99936347]\n",
      " [1.99965977 1.00034074]\n",
      " [2.99965485 1.20034566]\n",
      " [3.9998681  1.0001321 ]\n",
      " [5.00009002 0.79990984]\n",
      " [6.00008587 0.999914  ]]\n",
      "原始数据集(矩阵)X:\n",
      "[[1.  1. ]\n",
      " [2.  1. ]\n",
      " [3.  1.2]\n",
      " [4.  1. ]\n",
      " [5.  0.8]\n",
      " [6.  1. ]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn.decomposition import NMF\n",
    "\n",
    "# 构建原始非负矩阵(数据集)\n",
    "# 例如:X代表两个文档中的加权词频向量。一列代表一个文档\n",
    "# X的形状shape为(6,2),两个文档,每个文档六个词\n",
    "X = np.array([[1,1],[2,1],[3,1.2],[4,1],[5,0.8],[6,1]])\n",
    "# 构建NMF模型\n",
    "model = NMF(n_components=2,init='random',random_state=0)\n",
    "# 拟合模型,并得到转换矩阵W\n",
    "W = model.fit_transform(X)\n",
    "# 获得成分矩阵\n",
    "H = model.components_\n",
    "# 分布输出转换矩阵W和成分矩阵\n",
    "print(\"转换矩阵W:\")\n",
    "print(W)\n",
    "print('-'*37)\n",
    "print(\"成分矩阵H\")\n",
    "print(H)\n",
    "print()\n",
    "print(\"=\"*37)\n",
    "print(\"转换矩阵W与成分矩阵H的乘积:\")\n",
    "print(W@H)\n",
    "print(\"原始数据集(矩阵)X:\")\n",
    "print(X)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2023-09-14T06:51:20.883980900Z",
     "start_time": "2023-09-14T06:51:20.855123800Z"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
